# format_lst.py
def is_format(obj, mode, right_len: int = 3) -> bool:
    """
    检查对象是否符合指定格式。
    :param obj: 要检查的对象
    :param mode: 检查模式，可选值为 'list or tuple', 'Max2', 'Max3', 'Len3Max3'
    :param right_len: 要求的长度，默认为 3
    :return: 是否符合格式
    """
    if mode == 'list or tuple':
        return isinstance(obj, list) or isinstance(obj, tuple)
    elif mode == 'Max2':
        return is_format(obj, 'list or tuple') and all(item in [1, 2] for item in obj)
    elif mode == 'Max3':
        return is_format(obj, 'list or tuple') and all(isinstance(item, int) and 0 <= item <= 3 for item in obj)
    elif mode == 'Len3Max3':
        return is_format(obj, 'Max3') and len(obj) == right_len
    return False


def format_max3_to_max2(num_lst: list[int]) -> tuple[list[int], list[int]]:
    """
    将 Max3 格式的数字列表转换为 Max2 格式。
    :param num_lst: Max3 格式的数字列表
    :return: 转换后的两个 Max2 格式的数字列表
    """
    origin = [r if r in [1, 2] else 1 if r == 3 else 2 for r in num_lst]
    changed = [r if r in [1, 2] else 2 if r == 3 else 1 for r in num_lst]
    return origin, changed




'''应用掩码（在np就是一行代码的事 if matrix.shape == mask.shape:matrix[~mask] = -1）'''
def apply_mask(matrix: list[list[int]], mask: list[list[bool]]) -> list[list[int]]:
    """
    根据掩码修改矩阵中的元素。
    :param matrix: 要修改的矩阵
    :param mask: 掩码矩阵
    :return: 修改后的矩阵
    """
    if len(matrix) != len(mask):
        raise ValueError("Matrix and mask must have the same length.")
    for i in range(len(matrix)):
        if len(matrix[i]) != len(mask[i]):
            raise ValueError(f"Row {i} of matrix and mask must have the same length.")
        for j in range(len(matrix[i])):
            if not mask[i][j]:
                matrix[i][j] = -1
    return matrix
